{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

Lab 06: Evolving Brains

\n", "\n", "

CS371: Cognitive Science
\n", "Bryn Mawr College, Fall 2016
\n", "Prof. Blank\n", "

\n", "\n", "This is a team-based project." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Please put your \"# title\" and \"## by-line\" in the next two cells (respectively), and then delete this cell*" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "nbgrader": { "checksum": "11602f52fe25f5e421531fe993d637c1", "grade": true, "grade_id": "title", "locked": false, "points": 10, "solution": true } }, "source": [ "YOUR ANSWER HERE" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "nbgrader": { "checksum": "c3a78a17e38006b5095ace46d88155f1", "grade": true, "grade_id": "by-line", "locked": false, "points": 10, "solution": true } }, "source": [ "YOUR ANSWER HERE" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This lab explores using evolution to find a good Ladybug DNA. First, we have all of our imports and setup that we will need:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from calysto.simulation import DiscreteView, get_robot, DNARobot\n", "from calysto.display import display, clear_output\n", "import random\n", "import string\n", "import copy\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For these experiments, we will be using the DNA representation that is:\n", "\n", "* exactly 93 characters long\n", "* made up of the characters \"0123456789\"\n", "\n", "Remember that exactly what these 93 bits of DNA are is unknown to us, as is the meaning of each character. We don't know how these DNA encode a Ladybug brain, but we know that somehow they do.\n", "\n", "Our mission is to search through the space of possible Ladybug brains and find a good one, if not the best." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Genetic Algorithm\n", "\n", "Evolutionary algorithms are techniques for searching through a solution landscape in a generally effective manner. \n", "\n", "All evolutionary strategies have a core set of properties:\n", "\n", "* A \"population\" of solutions\n", "* Limited resources (not all solutions will survive)\n", "* A measure of performance, called ''fitness''\n", "* Preferential treatment toward the higher measured solutions (the most fit ones)\n", "* Reliance on randomness\n", "\n", "A typical evolutionary system follows this basic algorithm:\n", "\n", "1. Create a random population of solutions\n", "2. Compute a fitness measure for each\n", "3. Create new members by mutating and/or combining old ones (often selecting the better ones based on fitness)\n", "4. Select the most fit for the next generation\n", "5. Go to Step #3\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Randomized DNA Function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we make a simple function to make a random DNA string:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "alphabet = \"0123456789\"\n", "\n", "def make_dna(length):\n", " return \"\".join([random.choice(alphabet) for i in range(length)])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'667725087231604835114936588685531632573346010361182621852439651692351185085263856981249486522'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dna = make_dna(93)\n", "dna" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.2 Fitness Function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's let the ladybug move about for a few simulated seconds, or until it dies (whichever happens first). We'll take the fitness to be the average amount of energy that it has over that time.\n", "\n", "To make this a bit easier on our ladybug, we'll add an extra cluster of food around it when we test the ladybug.\n", "\n", "First, we make a simulation object and get the simulated ladybug:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sim = DiscreteView(\"Ladybug1\")\n", "robot = get_robot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nothing is visible, but it exists. This is to make the simulation run fast. Whenever we want, we can see where the ladybug is:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nJlx26HeHfnH6F/cvvP/oXxz94f/9YcyJPdT0UNPtTV/7OWf2AQCSCpdlYs/wSe4AAAIUSURBVObz\n9sNnJybW/vrlv/74/I8/2vLo9rbtulZN+5u9fzPpHaZ18QSf+9+f+9kXfvaJOz7xp/f+ae6RE78/\ncfMJio3/a2PPlp777rzvz9r+LPfIsfPH9ry9ZyovAQAIv/KWZSRlspkNz264f+H9nQ2dnry+ob7X\nT79+ffrTwZ+m3fT1/0RnvniCCc997/J77d9tf3DRg6sWrkq76b2/3Xv7jNsfaHwgd8H1K89eOtvx\n3Y41i9asaFgxenX0rXfe2ndynyd+aQYAYEqchlsavnjli5POvjvju8Ofnfg3QgAAguRtNfyzaaeb\nXlkGAICAKVSWiXpdXupoqinblFBi7CwZT45uGtX8Cq4VAICyi8ibbdrpHD0tZ8CJ/ihqKsu40qA0\nIkmql1qk+JjXYMqUKVOmTGt7atjpCpdlnCNOdFe0XvWL3EWSTsZPjmjk+jbJlClTpkyZ1v7UsNM5\nzmanrnv8eftrf2FMd6UlMWXKlClTpiGeOvEZ8e2Xt9980nBYwztm7JCn7VeYMmXKlCnT0E5NZZmZ\n2Zl1Xh1TpkyZMmUa1mmBssxtmdvu9PL+GgemTJkyZco06NNGtzGSbwYAgA0ip2On880uxi4yZcqU\nKVOmIZ6eip8ylWUuRC6ciTJlypQpU6ahnRYuy2SXZpkyZcqUKdMQT2+UZeZoTrPbLOlE/MQ5nbtx\nRJEpU6ZMmTIN7/T/AwfMGMsOI0UCAAAAAElFTkSuQmCC\n", "image/svg+xml": [ "0.0 Idle" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sim.render()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can define a fitness function. This is a little complicated, because we are using some of the internals of the simulation.\n", "\n", "`compute_fitness()` does the following:\n", "\n", "* takes a DNA string\n", "* creates a DNARobot (ie, the ladybug) which needs the original robot, and 93 character DNA\n", "* resets the simulation\n", "* let's it run for some seconds, or until it dies\n", "* computes the fitness avg energy over the run\n", "* returns fitness" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def compute_fitness(dna, seconds, show=False):\n", " new_robot = DNARobot(robot, dna)\n", " sim.setRobot(0, new_robot)\n", " sim.reset()\n", " while new_robot.energy > 0 and sim.clock < seconds:\n", " sim.step()\n", " if show:\n", " clear_output(wait=True)\n", " display(sim.render())\n", " fitness = sum(new_robot.history)/len(new_robot.history)\n", " return fitness" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we try it:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElE\nQVR4nO3df2xU553v8c+ZOZPYuWDCgiFhMNgOuDHQH46NIU5CwpJAS8qvpELbFFpE1d5tdXe12lZa\nrXS1Su9qpWarqtVut9vNXYmkynRzr9qYOiGpaVPaQGhqwm3rgmcTwIQFOz8MNA2EAZ9hzv1jAv6B\n59jMzPHMOc/79V/nO3PmmZGGp+P4edvSo7IOW9GOaLWq5zvzJZ2InRjQwOUNl91FrsSUKVOmTJmG\neWpZm63K9srPOJ+JK64r+tSXiCVSm1KSmDJlypQp0xBPrVhFbPvF7bfqVo3Ur/4dFTvkavslpkyZ\nMmXKNLRTe5Y769qZpDmaMzUztdKtZMqUKVOmTMM6rVa1PTc999pZ1pT0lFvdMR7JlClTpkyZhmNa\n49REcs0AADBB5JR9KtfsvH2eKVOmTJkyDfH0ZOxk5B3rnT71XTvrU9+5yLl3okyZMmXKlGlopwMa\niLqb3OSRZG2mtkpVw2eJWGJw42CmIcOUKVOmTJmGeGrpUVk9VvTH0SmZKVXpKknv2e+dj5wfOoTY\nY0V/HJ2hGXVOnaTjseNndIYpU6ZMmTIN3HTMnc4aKstkquen50s6YZ8YiAydxpckRzouvSNJmiXV\nSTENYcqUKVOmTMt76rHTjVOWGdoLAQAIJqvHa6eLxo7Ftg1um6M5wx9Tpaq6TF33se7Msoyik75k\nAACKxVHsCa+dLuJRlqlWtY5P0joBAPBFr7x3uohHWabGqdFpPxcHAIDfzsh7p6MsAwAwmldZ5mTs\npGZO5mIAACi2mcq/LDOgAdX7uTgAAPxWL++dbpyyjGZP4loBACi6iNzpXjvd+GWZ8uVIvdKAJKla\nqh95rBIAgCs8djpbklxJqlRl9oyFI+e8zpdyvRNg9ahitxoX6Z7lkrT3FSVf0MU1chtLvTIAQBnK\nvdPZVo9VuXPkeXtHfepLtCdSKtOyjJXUjH3a1anW1qEbu7q0dqPOWnJvL93KAADlx3unC2BZxtFN\nT2tPp1paRtwcj2vVfXrqUTl3qOzWDAAolRCWZXq1eImamsaYNDersVHluGYAQKmEsCxzRm1Lcw7b\nWlSOawYAlAplGQAAPASwLDNT+w/kHO5/VeW4ZgBAqYSwLFOvw4d0YKy9sKtLyaTKcc0AgFIJYVkm\novQ0tT+mlSsUH/oLix8cnzi3SppVurUBAMpNsMsyudsx2QP1Cxdo5QpJ2vOSjhwN/oH6UrVyaPQA\nCLtAlmW82zHuIqUWqvu4urslSQ3SmmD/812qVg6NHgBGCFxZZkLtmJjUIDWUZIFFVqpWDo0eACbw\n3ukidoe91dk6NJMkxRXf4myxO2w5JVixHFXu1u7nRvzrLKm1VZ3PqnK3SrMq/5Tq9Zr2PgMwkyPv\nna4syzKmtWNK9XpNe58BmCmQZRnT2jGler2mvc8AzERZBgAAD2VZljGtHVOq12va+wzATIEsy5jW\njinV6zXtfQZgpvHKMpH0unQilhh1j+x5+/T6tOzJWuhwtlKrtXbD6H+js7/Wn1qt0qzKP6V6vaa9\nzwDMZMt7pyvfskxQ2zH5VlpK9XqD+j4DwPUIZFkmiO2YQiotpXq9QXyfAeC65d7pLGuzVdk+8rz9\nlS+MqU0lK8sEkZXUjL3a1T5WpeVeKi0AUDJWj9dOF40di20b3JbdIa+qUlVdpq77WHdmWUbRSV9y\nEDm66Wnt6VRLy4ib43Gtuk9PPSrnDvFOAkAJOIo94bXTlWVZJoiotABAeQpkWSaIqLQAQHmiLAMA\ngIeyLMsEEZUWAChPgSzLBBGVFgAoT+OVZaLuJjd5JFmbqa1S1fBZIpYY3Dio2ZO41kCLKD1N7Y9p\n5QrFh/3Fq+zxiXOrpFmlWxsAmCwid7rXTle+ZZkgCmqlJd8aDgAERSDLMkEUxEpLITUcAAiM3Dud\nbfVYlTtHnrd31Ke+RHsiJcoy1y8mNUgNpV7GxFhJzdinXZ1j1XAsajgAQsJ7p6MsYzBqOABMQFkG\nOVHDAWACyjLIiRoOABNQlgEAwANlGYNRwwFgAsoyyIkaDgATUJZBTtRwAJjA3LKMf7UU7ysX8rz+\nXTm3Qms4VGkABIHHThfVfbLesSKvRaa502oyNVM19f3I+xesC+7trqpLvfB8WT2qfFofuUGbm7V8\ntpzDevd5XZ6mwl+R95ULeV7/rjyOaqWb9XZUv+7Vr9/W2/OUXq0J/iTAx1UBQFF57HQhLMv4V0vx\nvrLc/J/XvytPSF41HKo0AILCe6ezYhWx7Re3X3vSsF/9Oyp2OF9xAvaTLkc3fVf7XhzjnPjBg1qx\nWhe+lO/P7ryv/ICkfJ/Xvyv7x7/3GQCKy1Hsm147XejKMv7VUjyvPOcWLW7M93n9u7J/qNIACArj\nyjL+1VI8rzx7ptpac07HeV7/ruwfqjQAgoKyDAAAHkJXlvGvluJ55bdPa39Xvs/r35X9Q5UGQFAY\nV5bxr5bieeX+t3Q4me/z+ndl/1ClARAU45VlIul16UQsMeoe2fP26fVp2ZO10GKxlVqttRtG/xud\n/bX+1Grl/4q8r7ymgOf178r+8e99BoDisuW904WzLFNoLSXfKxfyvP5d2T/luSoAuJbHTmfpUVmH\nrWhHtDpTPT89X9IJ+8RAZCDQG6EkOdJx6R1J0iyprqiJNY8rF/K8/l3ZP+W5KgAYyWOns6zNVmX7\nyPP2V74wpjYFsiwDAMBwVo/XTheNHYttG9w2R3OGP6ZKVXWZuu5j3ZllGUUnfckAABSLo9gTXjtd\n6MoyAAAMZ1xZBgCA4SjLAADgIXRlGQAAhjOuLAMAwHDjlWWi7iY3eSRZm6mtUtXwWSKWGNw4OMG/\nVA4AQJmKyJ3utdOFsywzPkfqlQYkSdVS/TVH1z2mhVzZv8eWp/C9IgDB5LHTRXWfrHesyGuRae60\nmkzNVE19P/L+BeuCe7ur6lIv3B9Wjyqf1kdu0OZmLZ8t57DefV6Xpyn7er2nhVzZv8eWp/C9IgDB\n5bHT2VaPVblz5Hl7R33qS7QnUgphWcZKasY+7epU67C/dptNRZ+1JNdr6t6e/5X9e2x5Ct8rAhBc\n3judFauIbb+4/dqThv3q31Gxw/mKE6qfZTm66bva96KamkZPDh7Uigck5Z6u1oUv5f7JnveV/Xts\neQrfKwIQXI5i3/Ta6Qwry/Rq8ZIx/nWW1NysObdocWPOaWOjvN4Nzyv7+NjyFL5XBCC4KMuMcEZt\nS3MOZ89UW2vOaVuLvN4Nzyv7+NjyFL5XBCC4KMsAAODBsLLMTO0/kHP49mnt78o53f+qvN4Nzyv7\n+NjyFL5XBCC4KMuMUK/Dh3RgrH+ju7rU/5YOJ3NOk0l5vRueV/bxseUpfK8IQHCNV5aJpNelE7HE\nqHtkz9un16dlT9ZCJ4et1Gqt3TD63+jsr/Wn1nhOV8vr3fC+sn+PLU/he0UAgsuW905nYlnG6lHF\nbi1coJUrJGnPSzpyVBfXyG0cf1rIlf17bHkK3ysCEFweO52lR2UdtqId0epM9fz0fEkn7BMDkYEQ\nb4SS5EjHpXckSbOkumsSax7TQq7s32PLU/heEYBg8tjpLGuzVdk+8rz9lS+MqU0hLMsAAExj9Xjt\ndNHYsdi2wW1zNGf4Y6pUVZep6z7WnVmWUXTSlwwAQLE4ij3htdMZVpYBAJiGsgwAwGiUZQAA8GBY\nWQYAYBrKMgAAo41Xlom6m9zkkWRtprZKVcNniVhicOOgZk/iWgEAKLqI3OleO114yzKO1CsNSJKq\npfriHeX278oAAH947HS2JLmSVKnK7BkLR855nS/leguWjXs1LtI9yyVp7ytKvlCcuJd/VwYA+Cj3\nTmdbPVblzpHn7R31qS/RnkgpkGUZK6kZ+7SrU63D/spuNvd81pJ7ezleGQDgH++dLmJ32FudrcOr\nM5Liim9xttgdtpwSrLggjip3a/dzI/YqSa2t6nxWlbuV/yvy78oAAP848t7pQleW6dXiJWpqGmPS\n3KzGRuX/ivy7MgDAP8aVZc6obWnOYVuL8n9F/l0ZAOAfyjIAAHgIXVlmpvYfyDnc/6ryf0X+XRkA\n4B/jyjL1OnxIB8basbq6lEwq/1fk35UBAP4ZrywTSa9LJ2KJUffInrdPr0/LnqyFFout1Gqt3TB6\nx8oeckitVv6vyL8rAwD8Y8t7pwtnWSZ77H3hAq1cIUl7XtKRo8U8UO91ZbozAFB+jCvLuIuUWqju\n4+ruliQ1SGuKsyF5X5nuDACUqdw7nWVttirbR563v/KFMbUpkGWZUrGSmrFXu9rH6s7cS3cGAErG\n6vHa6aKxY7Ftg9uyO+RVVaqqy9R1H+vOLMsoOulLDiJHNz2tPZ1qaRlxczyuVffpqUfl3CHeSQAo\nAUexJ7x2utCVZUqF7gwAlCfjyjKlQncGAMoTZRkAADyErixTKnRnAKA8GVeWKRW6MwBQnsYry0Td\nTW7ySLI2U1ulquGzRCwxuHFQsydxrYEWUXqa2h/TyhWKD/uLV9njE+dWSbNKtzYAMFlE7nSvnS6c\nZZlS8a9oAwAohHFlmVLxr2gDACgIZRkAgLEoywAADEZZBgBgNMoyAACjUZYBAMADZRkAQKhRlgEA\nGI2yDADAaJRlAACgLAMAMFvunc62eqzKnSPP2zvqU1+iPZESZRkAQOB573SUZQAAoUZZBgBgNMoy\nAACjUZYBAMADZRkAQKhRlgEAGI2yDADAaJRlAACgLAMAMBtlGQCAsSjLAAAMRlkGAGA0yjIAAKNR\nlgEAwANlGQBAqFGWAQAYjbIMAMBolGUAAKAsAwAwG2UZAICxKMsAAAxGWQYAYDTKMgAAo1GWAQDA\nA2UZAECoUZYBABiNsgwAwGiUZYDJ40i90oAkqVqql2IlXhGALMoygO+sHlXsVuMi3bNckva+ouQL\nurhGbmOpVwZAlGUAn1lJzdinXZ1qbR26satLazfqrCX39tKtDABlGcB3jm56Wns61dIy4uZ4XKvu\n01OPyrlDfI6AkqEsA/iuV4uXqKlpjElzsxobxecIKCXKMoDvzqhtac5hW4v4HAGlRFkGAAAPlGWA\ngs3U/gM5h/tfFZ8joJQoywC+q9fhQzow1l7Y1aVkUnyOgFKiLAP4LqL0NLU/ppUrFI8P3Zw9PnFu\nlTSrdGsDQFkGmBzZA/ULF2jlCkna85KOHJ2sA/X+FW1o5SAsKMsAvnMXKbVQ3cfV3S1JapDWTMa2\n4V/RhlYOQoWyDDAZYlKD1DB5T+hf0YZWDsLEe6eL2B32Vmfr0EySFFd8i7PF7rDllGDFACbEUeVu\n7X5uxF4lqbVVnc+qcrfy//z6d2Vg8jny3ukoywCB5V/RhlYOwoSyDBBa/hVtaOUgTCjLAADggbIM\nEFj+FW1o5SBMKMsAoeVf0YZWDsJkvLJMJL0unYglRt0je94+vT4te7IWCuB62Uqt1toNo3es7CGH\n1Grl//n178rA5LPlvdNRlgGCzb+iTSlbOUCxUZYBQsu/ok2pWjmAL3LvdJa12apsH3ne/soXxtQm\nyjIAgMCzerx2umjsWGzb4LbsDnlVlarqMnXdx7ozyzKKTvqSAQAoFkexJ7x2OsoyAIBQoywDADAa\nZRkAADxQlgEAhBplGQCA0cYry0TdTW7ySLI2U1ulquGzRCwxuHFQsydxrQAAFF1E7nSvnY6yDDCS\nI/VKA5Kkaql+5BFy72kQnxcwA2UZYEKyUbHGRbpnuSTtfUXJF4aiYt7TID4vYJDcO51t9ViVO0ee\nt3fUp75EeyIlyjIwiJXUjH3a1anW1qEbs5nps5bkek3d24P3vIA5vHc6K1YR235x+7UnDfvVv6Ni\nh/MVh5/AwAiObvqu9r2opqbRk4MHteIBSbmnq3XhS/n+rLJUzwuYw1Hsm147HWUZQJLUq8VLxthv\nJDU3a84tWtyYc9rYqPw/KaV6XsAc45VlbO/z9v2n+9Xg5/qAMnFGbUtzDmfPVEtzzmlbiw4mlecn\n5YzaluryZSUS2rtXb72l++7T7NlavFhNTX4+L2CO8coy/HlNoKQcPfuMvvMtuVJESru67ad6Nab/\nmVHkvyk6RemPlnqFQNhRlgEkSTO1/0DO4duntb8r53T/q8rzk3JA1h6deEOXXWVcpV1J+vYl/cd5\nvXFBPxpQ7Rv6/vf0q18V+3kBo1CWASakXocP6cBYe2FXl/rf0uFkzmkyqTw+KdbzsnbJlS7nuEOT\n9FNXibQ2/Kl2PlO05wWMM15ZJpJel07EEqPukT1vn16fFj86hSFspVZr7YbRu132oEJqjed0ta77\nk9IldWkih5PWST+/qP/+mRFPnf/zAgay5b3TUZYBhmSPri9coJUrJGnPSzpydPTB9lzT63BB1jfk\n5vh4jXnzLukzMW39sqLRAp4XMBhlGWBC3EVKLVT3cXV3S5IapDVDB/W8pxMX+ZEsN+dPRMf0oNTq\n6nsvKD0v/+cFjJZ7p7OszVZl+8jz9le+MKY2UZYBis2V9b9yfh1Ujm+Ekg5KK6fq3Ff8WRUQalaP\n104XsTvsrc7W4TNJccW3OFvsDlvOpK8XCLdk7r3OU7NUcelKdxvAxDny3ukoywCT66gi+T50qSW9\nVcy1AEYYrywT8T5vr9N+Lg4w0HvK5PvQ+rT4z/fAdRuvLJP3/zcFACAMKMsAk2ta/j8aPWZLU4u5\nFsAIlGWA8nJbnj8adaWujDS7yMsBwo+yDFBeGiUrn8cdlAYrpOpirwcIPcoyQLlwpF5pQJHfSGdy\nfi/M9albdaN+sVKZ5V5XlqRqqZ7j9sBolGWAEsvm2RoX6Z7lSi3Q//7e9T18l6VXYsq0jHNlSXtf\nUfIFAmzANXLvdLbVY1XuHHne3lGf+hLtiZQoywBFYCU1Y592daq19YNbPrJEf/E/Jnqw/pD0ZzFd\n+PQYie1rr6wrSe6zltzbi7B4IAS8d7po7Fhs2+C27A55VZWq6jJ13ce6M8syipZg0UB4OLrpae3p\nVMuw73OtrfrDWXWN9TcOHx35P5+VHozpwia5t03oypLica26T089KucO8fkF5Cj2hNdOR1kG8Fmv\nFi9RU9Pom7/9T/ruv8rKvVX9Rnogokcqde6zyiy6jitLam5WY6P4/AISZRmg5M6obenYkz//c7Xe\nqdo6RSOKWLItSforW5+uUu0UPTxL6bt0/m6p5rqvLKmtRXx+AYmyDFDebFuf3KBLg3ry+9r2ea1b\np3mP6cF/0Y/3qfdtffiOPM9aAJg4+5R9KtcfRqMsAxTBTO0/kHP49mnt71I0qi1btGXL6On+V6X5\neV55nMcC5siWZXLvdJRlAJ/V6/AhHRhrx+rqUv9bOpzMOU0m5fUZ9LzyOI8FzEFZBigxW6nVWrth\n9I6VPeSQWuM5XT3GkYmJXtn7sYA5KMsAxZRvwyV77H3hAq1cIUl7XtKRo0PH3q0eVXRqdrXit0hS\n31t6e0AXPz6hQ/HeVy5kzUCYUJYBiqCQhou7SKmF6j6u7m5JUoO0ZuSGZOlPZqhlqSSl9uvtCf/C\np/eV6c4AH6AsAxSoCA2XmNQgNQTqykAoeO90EbvD3upsHZpJkuKKb3G22B22nBKsGCg7jip3a/dz\nI3YUSa2t6nxWlbuV/ycliFcGgsWR905HWQaYAP8aLkG8MhAslGWAIvCv4RLEKwPBQlkGAAAPkVP2\nqVwzyjLAB8ZtuOT9SQnilYFgyZZlcqAsA0yMfw2XIF4ZCBbKMkAR+NdwCeKVgWChLAMT+dNSGb/h\nku+qCr2y95rzbdYAYUJZBgbxr6Uyfh0m31UVcuUJPHeezRogVCjLwBC+t1RyNFyKsKq8rlyE5wUM\nQFkGxijPlkqpVlWe7wYw+SjLwCDl2VIp1arK890AJh9lGRikPFsqpVpVeb4bwOSjLAMAgAfKMgiR\n8myplGpV5fluAJOPsgwMUp4tlVKtqjzfDWDyUZaBQcqzpVKqVZXnuwFMPsoyMI1/lZZCV1VI4SXf\nVk55vhvA5KMsA4P4W2kpRL6Fl0JaOeX7bgCTjLIMzOJDpaUQhRReilCHKbN3A5h8lGWAkiqk8EId\nBigcZRmgxAopvFCHAQpHWQYosUIKL9RhgMJRlgEAwANlGcBnhRReqMMAhaMsA5RYIYUX6jBA4SjL\nACVWSOGFOgxQOMoyQDkopPBCHQYoHGUZoMQKKbxQhwGKIPdOZ1mbrcr2keftr3xhTG2iLAMACDyr\nx2uni8aOxbYNbsvukFdVqaouU9d9rDuzLKPopC8ZAIBicRR7wmunoywDAAg1yjIAAKNRlgEAwANl\nGQBAqFGWAQAYbbyyTNTd5CaPJGsztVWqGj5LxBKDGwc1exLXCgBA0UXkTvfa6SjLAADCj7IMAMBs\nuXc62+qxKneOPG/vqE99ifZESpRlAACB573TUZYBAIQaZRkAgNEoywAAjEZZBgAAD5RlAAChRlkG\nAGA0yjIAAKNRlgHCwJF6pQFJUrVUL8VKvKLxBXHNCC/KMkCAWT2q2K3GRbpnuSTtfUXJF3RxjdzG\nUq8styCuGSFHWQYIKCupGfu0q1OtrUM3dnVp7UadteTeXrqV5RbENSPcvHe6iN1hb3W2Ds0kSXHF\ntzhb7A5bTglWDOADjip3a/dzI3YUSa2t6nxWlbtVjp/QIK4Z4ebIe6ejLAOUsV4tXqKmpjEmzc1q\nbFQ5fkKDuGaEG2UZIMDOqG1pzmFbi8rxExrENSPcKMsAAOCBsgxQxmZq/4Gcw/2vqhw/oUFcM8KN\nsgwQYPU6fEgHxtpXurqUTKocP6FBXDPCbbyyTCS9Lp2IJUbdI3vePr0+LXuyFgrgWrZSq7V2w+h9\nJXsUIbVa5fgJDeKaEW62vHc6yjJAucseTl+4QCtXSNKel3TkaLkfTg/imhFulGWAAHMXKbVQ3cfV\n3S1JapDWlHuuLIhrRsjl3uksa7NV2T7yvP2VL4ypTZRlAACBZ/V47XTR2LHYtsFt2R3yqipV1WXq\nuo91Z5ZlFJ30JQMAUCyOYk947XSUZQAAoUZZBgBgNMoyAAB4oCwDAAg1yjIAAKONV5aJupvc5JFk\nbaa2SlXDZ4lYYnDjoGZP4loBACi6iNzpXjsdZRkAQPhRlgEAmC33TmdbPVblzpHn7R31qS/RnkiJ\nsgwAIPC8dzrKMgCAUKMsAwAwGmUZAIDRKMsAAOCBsgwAINQoywAAjEZZBgBgNMoyAABQlgEAmI2y\nDADAWJRlAAAGoywDADAaZRkAgNEoywAA4IGyDAAg1CjLAACMRlkGAGA0yjIAAFCWAQCYjbIMAMBY\nlGUAAAajLAMAMBplGQCA0SjLAADggbIMACDUKMsAAIxGWQYAYDTKMgAAUJYBAJiNsgwAwFiUZQAA\nBqMsAwAwGmUZAIDRKMsAAOCBsgwAINQoywAAjEZZBgBgNMoyAABQlgEAmI2yDADAWJRlAAAGoywD\nADAaZRkAgNEoywAA4IGyDAAg1CjLAACMRlkGAGA0yjIAAFCWAQCYjbIMAMBYlGUAAAajLAMAMBpl\nGQCA0SjLAADggbIMACDUKMsAAIxGWQYAYDTKMgAAUJYBAJiNsgwAwFiUZQAABqMsAwAwGmUZAIDR\nKMsAAOCBsgwAINQoywAAjEZZBgBgNMoyAABQlgEAmI2yDADAWJRlAAAGoywDADAaZRkAgNEoywAA\n4IGyDAAg1CjLAACMRlkGAGA0yjIAAFCWAQCYjbIMAMBYxS/L3Db9tgdue2Ddh9YtmbVkyg1TTrx7\nwnsFd9Xc9ciHH7l73t2u3JPvncx1t/vr7/9i8xcl9f6h1/sO9dPrve8JAMAHxivL2N7n7fuP96th\n6Malc5Z+++PfbqtpG37PN8+9+fmOz79w9IVrL2JH7I5Pd3x8wcctWZJcuc+9/tympzdddi9fe+e7\n5939N3f9zcX0xZ/1/mzM13L1DpK87wkAwAeKW5Z5sOHBtpq2VDr1yxO//LeD//b4wceTA8lbpt6y\n88921k8f46TFP/zpP3xiwScupS89+bsnn/zdk5fSl9Y1rPvayq8V/LIAAJiY8coy9nVdrfvt7s+2\nf/aHPT9MpVPZWyxZP//cz++tvXfDhzZ865VvDb9zhV3xl8v+MuNmPpH4xC/e+IWkJ377xIufffGv\n7/zrv//l31+6fGkiz/hA/QMtc1rOD57/ydGf5LpPLBJ7qPGh+un1f7z0x6cPPX02dfa6XhQAwGT2\nKfuUxvg5pTRWWeaZ5DOj7uPKvXT5kiXr2p92LosvuzF648n3TmZ3QUm/eOMXp947VTOtZml86b7/\n2ue9smk3Tnv+M88vn7vcsqzsT1aP/2GMBHh8avzl7S/Pu3le9j5fv//rq55cdaD/gPfFAQCmyJZl\ncu90dva8/dAv0lzhUZa5v/7+++vvlzTlhil3z7v7o7M/mnEzz73+3Ki7za2aa1nWqD3pYP/BedPm\n1VTVjLvyH27+4Z01d54fPN/xWoekh25/qG563bV3e/aRZ+dNm3fmwpmd/7lz+dzlS2Yt+cHDP2j4\n5wZX/L4rAGCoLJNrp7PT69KJnYkRv1R65bx9en1aY/3oNPtLK1f/pyv3n379T9f+AuetU2+VdOq9\nEYW37G+NZkceFlUvWlW3ajA92PS9pmN/OCapYUbD77/0+xuiNwy/W9MtTR+75WPvD77f+C+Npy+c\ntiP2G3/1xoI/WXDXvLvG/cYJADCCLe+dznYXuykrtePHOyZelvlZ789STupG+8a6m+vWNaybeuPU\nLzZ/8Rv7v9F/rr9Yy266pcmyrN29u7O7oKTXz7z+096fPrjwweF3WzJriSXrbOrsV9u+mr3l3Yvv\nxqfGG2c2shECALK8d7p8yjL7/mvf1W2mwq449OVDdTfXfbLhk48ffHz43d4896akuVUjflcn+z+z\nIw8102okHTlzZPiNr595fdRGGK+KS5o3bd7wb6iawDdOAIBZ/CvLXExf7Dza+eWlX55ROWPU6NR7\np1zXXTpn6fAbW+a0eB+rzzr5x5OSFs5YOPzGhhkNo+6W3VB7Bnq+/7vvD4qwxloAAAN8SURBVL/9\n5ZMve18fAGAO750uYnfYW52to/4TYlzxLc4Wu8OWM+JaX7jjCw81PhSxhv6c702xm9YuXOvKff3M\n65Lur7//6/d/PfurNL/u+/Wly5fmVs29d/692TvfV3vf3Kq5F9MXD/SN81udv3nrN5LW3LZm/rT5\n2Vvqbq7LXna4Q+8cklQzrebf/9+/P/byY4+9/Ng/vvyPr515rXFm4/W8RQCA8HLkvdNdX1kmXhV/\nfN3jb55/80DfgdfOvHbrlFvXfWjdtBun9Z/rf/7I8xpZh7mYvvidru98te2rP9nykx/8/geSHvnw\nIxEr8q1ffWvcQ4Q9Az0vHn9xVd2q7i91tyfbZelTiz51Y/TGUXc7+ObBX5361Z1z7zzyF0ee+c9n\nbMu+t/be2ptrv/ZLzuwDACSNX5axvc/b958esRE+f+T5hxsfXjJryfoPrb964+/f+f3D/+fhq0fs\nh/vbF//2I7M/8kD9A9ubtutKYu3v9vzdRFb+qf/7qZ9/9ucfveWjn/vY57K3HP/D8WtPUKz/j/Wd\nWzrvuPWOzzd9PnvL0bNHd72+ayJPAQAIv+KWZbr6uj78rx/+2C0fa761eXrl9JN/PHl44HD255NZ\n2V8ovfqf6NKZ9Jqn1tw5987WeKsrt6uv65VTr+S6+KjHvnvx3ebHm++Zf8/yuctTTmrPG3turrj5\nrpq7sne4es/TF063PN6yYv6KpfGlg5cHf/vWb/ee2MshQgDABFnxG+NfuPSFMWePVzze/9CIb4QA\nAATM64r/yGuni2TP21878yjLAAAQGFfKMtdOsjtd1N3kJo8kazO1VaoaPkvEEoMbBzV7EtcKAEDR\nReRO99rpLD0qq8eK/jjqVZZxpF5pQJJULdVLsWHPwZQpU6ZMmZb31GOnG78sYx22oh3RalXPd+ZL\nOhE7MaCBq9skU6ZMmTJlWv5Tj53OsjZble2VY6ZIU5tSkpgyZcqUKdMQT61YRWz7xe3XnjTsV/+O\nih1ytf0SU6ZMmTJlGtqpV1lmamZqpVvJlClTpkyZhnU6TllmSnrKrW7OP+PAlClTpkyZBn1a49RE\ncs0AADBB5JR9KtfsvH2eKVOmTJkyDfH0ZOykV1nmXOTcO1GmTJkyZco0tNPxyzKZhgxTpkyZMmUa\n4ulQWWaGZtQ5dZKOx46f0ZmhI4pMmTJlypRpeKf/H2pA/9UYTzxkAAAAAElFTkSuQmCC\n", "image/svg+xml": [ "3.0 Idle" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "92.5\n", "CPU times: user 2.85 s, sys: 14 ms, total: 2.87 s\n", "Wall time: 3.11 s\n" ] } ], "source": [ "%%time\n", "dna = make_dna(93)\n", "print(dna)\n", "print(compute_fitness(dna, 3, True))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "198996236972211213555226682775354052437519977701384932237059263031245677270529281530796359230\n", "92.5\n", "CPU times: user 552 ms, sys: 5 ms, total: 557 ms\n", "Wall time: 799 ms\n" ] } ], "source": [ "%%time\n", "print(dna)\n", "print(compute_fitness(dna, 3, False))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the display on, it will take about the number of seconds run. Without the display, the actual time taken is less that seconds given." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.3 A Mutate Function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For all of the search methods (besides Greedy search) we need a method of slightly changing the DNA. \n", "\n", "For some search algorithms, we will need a variable amount of mutation. So, we will make our `mutate` function take two arguments: the DNA to mutate, and an amount. The amount will be the number of mutations to make.\n", "\n", "Write your mutate function here:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true, "nbgrader": { "grade": false, "grade_id": "mutate", "locked": false, "points": 30, "solution": true } }, "outputs": [], "source": [ "def mutate(dna, amount):\n", " dna_list = list(dna)\n", " ### BEGIN SOLUTION\n", " for i in range(amount):\n", " point = int(random.random() * len(dna))\n", " dna_list[point] = random.choice(alphabet)\n", " ### END SOLUTION\n", " return \"\".join(dna_list)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1XX'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mutate(\"XXX\", 1)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'198206236932211213555226682775354052437519977771384932237052263031245677270529885530686359230'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mutate(dna, 10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.4 Putting it altogether\n", "\n", "We define a make_pop() function that will generate a number of DNA. We return them as a list of pairs:\n", "\n", "```python\n", "[[0, DNA1], [0, DNA2], ...]\n", "```\n", "\n", "The zero is a place keeper where we will put the fitness in a moment." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def make_pop(size, dna=None):\n", " pop = []\n", " for i in range(size):\n", " if dna is None:\n", " pop.append([0, make_dna(93)])\n", " else:\n", " pop.append([0, mutate(dna, 10)])\n", " return pop" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[[0,\n", " '288011181125947895543144113760071612630986198389816490561083032835531858849961664286602626144'],\n", " [0,\n", " '535509792262951458600411106626311989962369722112135552266827753540524375199777013849322370592'],\n", " [0,\n", " '630312456772705292815307963592305019810338376558525912677696262144070735157945904944963440121']]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop = make_pop(3)\n", "pop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## How diverse is the population per position?\n", "\n", "We define a simple function to show the diversity of the population. Along the top will be each position of the DNA. Along the left side is the possible values for a location (a gene). The matrix is filled with the counts of those genes in that location." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def show_diversity(pop):\n", " counts = [{} for i in range(len(pop[0][1]))]\n", " for i in range(len(pop)):\n", " for j in range(len(pop[i][1])):\n", " c = pop[i][1][j]\n", " counts[j][c] = counts[j].get(c, 0) + 1\n", " print(\" 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012\")\n", " print(\" ---------------------------------------------------------------------------------------------\")\n", " for number in range(9, -1, -1):\n", " print(\"%s: \" % number, end=\"\")\n", " for position in range(len(counts)):\n", " count = int(counts[position].get(str(number), 0)/len(pop) * 10)\n", " if count == 10:\n", " count = \"X\"\n", " elif count == 0:\n", " count = \".\"\n", " print(count, end=\"\")\n", " print()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012\n", " ---------------------------------------------------------------------------------------------\n", "9: .....3.3....6...6.......3...3....3.63..3.3.3...3...33.....3..............366..3..3.33......3.\n", "8: .33....3.......3.33...............3.3...33..3.333........33....3.....3.33........33..........\n", "7: ......3..33.3.3........3...3...3..........33...........33..33......3.33...3333..........3....\n", "6: 3.......3.3.......3......33333...3..33..33..3.....3...3633.3.3..............3.33...333.3.3...\n", "5: 3.33...3...3.33.333.3......3....3............33.3.633.3......3.3.36...36.3...3............3..\n", "4: ......3......3.3...3.333...........................3............63..3....3..3...6.63...33..33\n", "3: .6.3................33....6...6......3.63.3..3...3.........3.33.3..3.33.........3...3.33.....\n", "2: 3....3..3336...3.3..........33.....3..3....33..3.3...63...3.3.6....3.............3...36.3..33\n", "1: ....633.33....3....3.33363.....36.6..3....3..33.33..3...3......3....3...6....3.3..........6.3\n", "0: ..333........3.....33.3..3...333.3....6..............3...3..3....33.3.........33.....3...6...\n" ] } ], "source": [ "show_diversity(pop)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "for i in range(len(pop)):\n", " pop[i][0] = compute_fitness(pop[i][1], 3)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "pop.sort(reverse=True)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[[92.5,\n", " '630312456772705292815307963592305019810338376558525912677696262144070735157945904944963440121'],\n", " [92.5,\n", " '535509792262951458600411106626311989962369722112135552266827753540524375199777013849322370592'],\n", " [92.5,\n", " '288011181125947895543144113760071612630986198389816490561083032835531858849961664286602626144']]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Crossover Function\n", "\n", "Crossover exchanges pieces of two genomes. Crossover can be a perfect shuffle, uniform, or point-based. Shuffle simply alternates between each parent. Uniform tosses an even coin to see if the gene comes from the mother or the father. Point-based mutation will only crossover at particular points. Shown here is a single point crossover:\n", "\n", "\n", "\n", "To use crossover, we need a method of selecting good parents:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def select(pop):\n", " \"\"\"\n", " Given a population of the form [[FITNESS, DNA], ...]\n", " pick one (with better fitness, more likily to be picked), \n", " and return a copy of the DNA.\n", " \"\"\"\n", " partsum = 0.0\n", " sumFitness = sum([item[0] for item in pop])\n", " if sumFitness == 0:\n", " raise Exception(\"Population has a total of zero fitness\")\n", " spin = random.random() * sumFitness\n", " index = 0\n", " while index < len(pop) - 1:\n", " fitness = pop[index][0]\n", " if fitness < 0:\n", " raise Exception(\"Negative fitness in select: \" + str(fitness))\n", " partsum += fitness\n", " if partsum >= spin:\n", " break\n", " index += 1\n", " #print(\"index:\", index)\n", " return copy.copy(pop[index][1])" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'630312456772705292815307963592305019810338376558525912677696262144070735157945904944963440121'" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "select(pop)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our crossover function will replace a segment of the population, given by `percentage`:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def crossover(pop, percentage):\n", " \"\"\"\n", " Given a population and a percentage, replace\n", " that percentage of the population with new\n", " individuals created from higher-fitness individual.\n", " New individuals replace the worst-performing individuals.\n", " \"\"\"\n", " old_pop = copy.copy(pop)\n", " for j in range(int(len(pop) * percentage)):\n", " p1 = select(old_pop)\n", " p2 = select(old_pop)\n", " # Pick a crossover point:\n", " point = random.randint(0, len(pop[j][1]) - 1)\n", " child = []\n", " for i in range(len(pop[j][1])):\n", " if i < point:\n", " child.append(p1[i])\n", " else:\n", " child.append(p2[i])\n", " child = \"\".join(child)\n", " #print(\"p1:\", p1)\n", " #print(\"p2:\", p2)\n", " #print(\"c :\", child)\n", " #print(\"replacing\", len(pop) - j - 1)\n", " pop[len(pop) - j - 1][1] = child" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the following cell, provide settings for all of the parameters, such as:\n", "\n", "```python\n", "generations = 2\n", "simulated_seconds = 3\n", "pop_size = 10\n", "mutations_per_individual = 10\n", "crossover_percentage = .33\n", "```" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "09cd8eaec325893c2127b329fc2d7353", "grade": false, "grade_id": "parameters", "locked": false, "points": 20, "solution": true } }, "outputs": [], "source": [ "### BEGIN SOLUTION\n", "generations = 10\n", "simulated_seconds = 5\n", "pop_size = 10\n", "mutations_per_individual = 10\n", "crossover_percentage = .33\n", "### END SOLUTION" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And then run the experiment!" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Computing fitness...\n", "Sorting...\n", "Generation: 1 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n", "Computing fitness...\n", "Sorting...\n", "Generation: 2 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n", "Computing fitness...\n", "Sorting...\n", "Generation: 3 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n", "Computing fitness...\n", "Sorting...\n", "Generation: 4 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n", "Computing fitness...\n", "Sorting...\n", "Generation: 5 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n", "Computing fitness...\n", "Sorting...\n", "Generation: 6 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n", "Computing fitness...\n", "Sorting...\n", "Generation: 7 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n", "Computing fitness...\n", "Sorting...\n", "Generation: 8 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n", "Computing fitness...\n", "Sorting...\n", "Generation: 9 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n", "Computing fitness...\n", "Sorting...\n", "Generation: 10 Best: 115.75\n", " Best DNA: 199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735\n", "Mutating...\n" ] } ], "source": [ "best_fitness = []\n", "pop = make_pop(pop_size)\n", "for generation in range(generations):\n", " print(\"Computing fitness...\")\n", " for i in range(len(pop)):\n", " pop[i][0] = compute_fitness(pop[i][1], simulated_seconds)\n", " print(\"Sorting...\")\n", " pop.sort(reverse=True)\n", " print(\"Generation:\", generation + 1, \"Best:\", pop[0][0])\n", " print(\" Best DNA:\", pop[0][1])\n", " print(\"Mutating...\")\n", " best_fitness.append(pop[0][0])\n", " for i in range(2, len(pop)):\n", " pop[i][1] = mutate(pop[i][1], mutations_per_individual)\n", " # Crossover:\n", " crossover(pop, crossover_percentage)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.5 Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, you can examine different aspects of this evolutionary run." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[[115.75,\n", " '199777013849322370592630312456772705292815307963592305019810338376558525912677696262144070735'],\n", " [106.44444444444444,\n", " '879961668136608656828582931173558626726394621678393989229862522413204340489912115921688388838'],\n", " [106.44444444444444,\n", " '179201668136608640828501600281522048866996064979382667781462401430204807460557865983683896836'],\n", " [106.44444444444444,\n", " '149201668136608640828512600281522048866996064979382667781462401414204427560857815270686702838'],\n", " [87.5,\n", " '879961668636608640828501600281522048866996064968382667781464401430204800460507869983183896836'],\n", " [87.5,\n", " '879961668636608640828501600281522048866996064968382667781464401430204800460507869983183896836'],\n", " [87.5,\n", " '879961668636608640828501600281522048866996064968382669781464401414204420560857815270196702836'],\n", " [87.5,\n", " '879961668636608640828501600281522048866996064968382669781464401414204420560857815270196702836'],\n", " [87.5,\n", " '879961668636608640828501600281522048866996064968382667781464401414204420560857815270196702836'],\n", " [87.5,\n", " '149201668136608640828501600281522048866996064968382669781464401414204420560857815270196702836']]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What does the diversity of the population's DNA look like?" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012\n", " ---------------------------------------------------------------------------------------------\n", "9: .1X6.......1.......1....1............1.89....9.2.2.1.4..2...............1.11...124...4..3....\n", "8: 6.......91....9...9.9.1.....8...1..88..1.......7.8..1..8.2....1.....13...1.5..8...3..513119.2\n", "7: .7.111..........1...........1.11.1..1.......1.3......58.........1......2....19....5....51.1..\n", "6: ....6.99.5.99..9.1...1..8....1...1.1.89..818.17....88.....9......1.......8.1..131.1.3.5..3..7\n", "5: ................1.1..9......1.91...1.....1......1....1......1.....11.1.15..36...7...........1\n", "4: .2........1.....8..........1......8......1..8............8.68..9.5..951.4............11......\n", "3: ........1.9.1..1......1.11...1.........1..1....19.11........11.131...1.............3..31...X.\n", "2: ...3.........11....91..2..18...89.1.111....1......9...11...3.11...9...6...1..1...611.....5...\n", "1: 4....9.1.4............17.111.8..........1...1..........18.1...8.6........1..1.16...17........\n", "0: ....3.1......9...9....71.88......81.......81........1.1....1.8...3.9..37..8.2......5...151...\n" ] } ], "source": [ "show_diversity(pop)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the following cell, discuss the diversity of the population. Is this what you expected? Did it \"converge\"? Or is the population fairly diverse?" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "nbgrader": { "checksum": "88040ebdd821aff95c2adbfaf460fbbc", "grade": true, "grade_id": "diversity", "locked": false, "points": 20, "solution": true } }, "source": [ "YOUR ANSWER HERE" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the following cell, create a matplotlib graph of the best fitnesses over time." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[115.75,\n", " 115.75,\n", " 115.75,\n", " 115.75,\n", " 115.75,\n", " 115.75,\n", " 115.75,\n", " 115.75,\n", " 115.75,\n", " 115.75]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "best_fitness" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "6fe0e895a83ed605e7c77f9034fc44c5", "grade": false, "grade_id": "matplotlib-best", "locked": false, "points": 20, "solution": true } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "### BEGIN SOLUTION\n", "plt.plot(best_fitness)\n", "plt.xlabel(\"Generation\")\n", "plt.ylabel(\"Fitness\")\n", "plt.ylim(50,200)\n", "plt.show()\n", "### END SOLUTION" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As part of any experiment, you'll want to examine different solutions. This section explores how you can watch a DNA control the ladybug, and make a movie for showing.\n", "\n", "First, we define two functions:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def watch_one(dna, seconds=10):\n", " new_robot = DNARobot(robot, dna)\n", " sim.setRobot(0, new_robot)\n", " sim.reset()\n", " while new_robot.energy > 0 and sim.clock < seconds:\n", " sim.step()\n", " clear_output(wait=True)\n", " display(sim.render())\n", " print(\"fitness:\", sum(new_robot.history)/len(new_robot.history))\n", " \n", "def make_movie(dna, name, seconds=10):\n", " new_robot = DNARobot(robot, dna)\n", " sim.setRobot(0, new_robot)\n", " sim.reset()\n", " frame = 0\n", " while new_robot.energy > 0 and sim.clock < seconds:\n", " sim.step()\n", " canvas = sim.render()\n", " canvas.save(\"%s-%04d.gif\" % (name, frame))\n", " frame += 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`watch_one()` takes a DNA string, and simply renders it on each step:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dna = '900499520468472606914876192567498206996983559871961745555167134603951243523914525534679075336'" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nMgAAX6NZBgAQaDTLAAACjWYZAABolgEABBvNMgCAwKJZBgAQYDTLAAACjWYZAECg0SwDAIADmmUA\nAL5GswwAINBolgEABBrNMgAA0CwDAAg2mmUAAIHlSrNMbHzskYWPrP7kakm97/WOSJfUL3noUw/d\nNfMuW/aJD044bO7TUz+95pNrPtv42doba3//x99fsi/leuZ9Tff9+YI/H/NyI57QNLHJ+ZkAgADJ\n1yxjOp+3H+gb0Nxhj7fF2r5733eXzFwSNsKGYVxIXXi+9/krqRkyO/+084HZDxgyJNmyn37r6fVP\nrh894dpibT/6wo8+OemTUTNqGIakt8+9/eC/PfjyiZfHvJG7Zt71rSXfGnG5MZ8gyfmZAIAAKXmz\nzKo5q+5puMcwjNPJ06Nf8nef/bvPzf7cxdTFn77x05++8dOLqYur567+9rJvj37mqjmrWqa12LLf\neOeN73d9/7WB16aNm7Zr466ba26+vjsEAMBBvmYZ83oXfP0Pr3+l8yvb/2v71xd9/W/u+ZvsqMas\n+fqir6ft9Ofin3vhdy9I2vabbXu+vOcv7/zLv/3Pv7146eKIpVLp1Nd2fm3bG9sy//urr/xq8YzF\nyxuX/zzx82vczP1N97dObz03dO65o8/lek4kFPli8xebJjb98eIfnzz05JnkmWu+VwCA/5knzZPK\n8Q9zYzbLPPXmU7nWWhRbdGP4xhMfnMhMQUkv/O6Fkx+crJ9QvzC2cN/v92U/+bx1/oHHH9jTt+fK\nIz2DPYtnLJ798dnXsu8JN0545uFnFs9YbBhG5sewfe+NURAeGx97ecvLM2+emXnOd+77zvKfLj8w\ncOBaLgEA8INMs0zuSVfKZpkZtTMMwxgxZg4OHDRk1NfWj3jyP7zyD9lTcNwN49beuvaSfenomaPX\ncq1/3/Dvd9bf+aH14RO/fSL+23jSSjZObBz9tB0P7Zg5Yebp86d/8uufHDp1aPwN45/40hOZoQgA\nCIR8zTKh1OpUPBIf8YzMefvUmpSu50ent4y/RdLJD4ZVumV+azQTZRvxk9IffeFHk6KTet/r3fHW\njrwXmlc3b3nj8qHUUMuPWjb+YuPGX2z8zD9/ZujS0IintUxr+cy0z3xofdj8/eav7vhqyz+39J/t\nn/3x2UtmLrmOuwIAeJop50ln2vPtpJHc+tTWSjXLGDL+cdU/Pvyph/ve71u6denoeTZay7QWwzB2\n9+4+9t6xzCNvnX7rl72//Pycz2c/7bYptxkyziTPfLP9m5lH3r/wfmx8rGCb9VgAAAQBSURBVHly\n84if0wIAfMx50pWyWeYPZ/8gaUbtsF/OyfxvJhotbITjX4r/yfw/6X2vd/FPFg+eH7yWC9VPqJd0\n5PSR7AffOv3WiEEYq41Jmjlh5reWfCv78dHfngIAfK48zTInPzhp2/bC6QuzH2yd3prrWH3ICD35\n4JMPznvwxAcnrn0KSjrxxxOS5kyak/3g3ElzRzwtM317Bnt+9sbPsh/PdVQRAOBLzpMuZHaam6xN\nVzNJUkyxjdZGs9OUdR1XerX/1YuXLs6onXHPrHsyj9zbcO+M2hkXUhcO9B+QdF/Tfd+57zv3Nd0n\nyZDxr2v+9cF5Dw6eH2z/l/Zrn4KSXn/7dUkrP7Fy1oRZmUcab27MLJvt0KlDkuon1P/k1z957OXH\nHnv5se++/N03T7/ZPLn5Ou4KAOBplpwn3XU3y9zXdF9m5Nw1867M/9aYNZKe733++d7n/6nrn77Z\n/s3nNj73xG+fkPTQpx4KGaG//9XfZ341Jrsd5i9a/+LPPvNnkl48/uLX2r52Zf2Xf/9y3t+X6Rns\n2dO3Z3nj8u5HujsSHTL04LwHbwzfOOJpB/9w8Fcnf3XnjDuP/I8jv/ivX5iGeU/DPQ03N3z7P8c4\n4A8A8Kd8zTKm83n7gXdHDsLMMLvyv0vqlyypXyIpM97+as9f3T719vub7t/SskWXK9b+eu9fj158\n2rhpmf/4UvOXsh//4Y0/vJZfHH3w3x78jy//x6enfTozTSX1vdc3+gTFmv+7ZtfGXXfccsdXWr6S\neeTomaM739qZd30AgE+UvFnm+d7nk1Zy9OOZf3hLpVMrH19554w722Jttuyu/q5XTr4y4rWZZ+Za\n57WB1xyue+Wf996/8P6CHy+4e9bdi2csTlrJvb/be3PNzUvql2SecOWZ755/t/XHrUtnLV0YWzh0\naeg3b//mpeMv2eJPagAAPmLEbox99eJXx8x+XPPjgS+O/I4QAAAveUuxnztNulI2ywAAUHXyNcuE\n7fV24kiiId1Qq9rsLB6JD60b0tQy7hUAgJILyZ7oNOkMPSqjxwg/FXZqlrGkXilzwKFOapIiWdcg\nJSUlJSWt7tRh0uVvljEOG+HOcJ3qZlmzJB2PHB/U4JUxSUpKSkpKWv2pw6QzjA1GtGP4efvL3zAm\n1yclkZKSkpKS+jg1IjWRLRe2jD5pOKCBrTVbZWvLRVJSUlJSUt+mTs0y49Pjo3aUlJSUlJTUr2me\nZplxqXG32Dn/UAMpKSkpKanX03qrPpQrAwAgCEInzZO5snPmOVJSUlJSUh+nJyInnJplzobOngqT\nkpKSkpL6Ns3fLJOemyYlJSUlJfVxerVZZpImNVqNkvoifad1+uoRRVJSUlJSUv+m/x+QnClyyCJX\nJgAAAABJRU5ErkJggg==\n", "image/svg+xml": [ "10.2 Idle" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "fitness: 74.5\n" ] } ], "source": [ "watch_one(dna)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAAKNsgwAINAoywAAQFkGABBslGUAAIHlSlkmPj7+8MKH13xijaSu97qGTJfULnnwkw/eM/MeR86p\nD04ZFvepqZ9a+4m1n6n/TOzm2O//+PsrzpVc91zRsOLPFvzZiE835A4NExvM9wQABEi+skzEfN6+\nt7tXcwfd3hJv+d6K7y2ZuSRshS3LupS+9HzX89emkVBk13/b9dnZn7VkSXLkPPPWMxue3DB8h2uJ\ntzz2hcc+MekT1ZFqy7IkvX3h7Y0/3/jyqZdHfCH3zLzn20u+PeTpRryDJPM9AQABUvSyzOo5q++r\nu8+yrLOps8Mf8ref+dvPzf7c5fTln77505+++dPL6ctr5q75zrLvDL/n6jmrm6Y1OXLefOfNH7T/\n4PXe16eNm7Zn855bq269sVcIAIBBvrJM5EYv+MYf3vjqrq/u/K+d31j0jb++768HjqoiVd9Y9I2M\nk/lc4nMv/O4FSTt+vWPfl/f9xd1/8Tf/8TeXr1wecql0Jv313V/f8eaO7B9f+eori2csXl6//BfJ\nX4xyMQ80PNA8vflC/4VfHf9VrvtEQ9EvNn6xYWLDHy//8ckjT55LnRv1awUA+F/kdOS0cvzD3Ihl\nmad++1Suay2KL7o5fPOpD05ld0FJL/zuhdMfnK6dULswvvDA7w8MvPNF++JnH//svu59127p7Otc\nPGPx7I/NHs26J9w84dmHnl08Y7FlWdlvw3a/N0IgPD4+/vK2l2feOjN7n++u+O7yny4/1HtoNE8B\nAPCDbFkm905XzLLMjNgMy7KGbDOHew9bsmpjtUPu/A+v/sPAXXDcTePW3b7uinPl+Lnjo3muf930\nr3fX3v2h/eETv3ki8ZtEyk7VT6wffrenH3x65oSZZy+e/cl//uTIu0fG3zT+iS89kd0UAQCBkK8s\nE0qvSSeiiSH3yJ63T69N60a+dXrb+Nsknf5gUNIt+1Oj2dFAQ75T+tgXHptUPanrva6n33o67xPN\nq5m3vH55f7q/6bGmzb/cvPmXmz/9z5/uv9I/5G5N05o+Pe3TH9ofNv6g8WtPf63pn5t6zvfM/tjs\nJTOX3MCrAgB4WkTmnS7izHdSVmr7U9vLVZaxZP3j6n986JMPdb/fvXT70uH72XBN05osy9rbtffE\neyeyt7x19q1/6/q3z8/5/MC73THlDkvWudS5b7V+K3vL+5fej4+PN05uHPJ9WgCAj5l3umKWZf5w\n/g+SZsQG/XBO9o/Z0XBhK5z4UuJP5/9p13tdi3+yuO9i32ieqHZCraRjZ7KKE10AAAPOSURBVI8N\nvPGts28N2QjjsbikmRNmfnvJtwfePvzLUwCAz5WmLHP6g9OO4yycvnDgjc3Tm3Mdqw9ZoSc3Prlx\n3sZTH5wa/S4o6dQfT0maM2nOwBvnTpo75G7Z3bezr/Nnb/5s4O25jioCAHzJvNOFIrsiW+wt12eS\npLjim+3NkV0R2TfwTK/1vHb5yuUZsRn3zbove8v9dffPiM24lL50qOeQpBUNK7674rsrGlZIsmT9\ny9p/2ThvY9/Fvtb/3Tr6XVDSG2+/IWnVx1fNmjAre0v9rfXZyw505N0jkmon1P7kP3/y6MuPPvry\no997+Xu/PfvbxsmNN/CqAACeZsu8091wWWZFw4rslnPPzHuyf6yKVEl6vuv557ue/6f2f/pW67d+\ntflXT/zmCUkPfvLBkBX6+1f+PvujMQPrMH/e/Odf+fRXJL148sWvt3z92vVf/v3LeX9eprOvc1/3\nvuX1yzse7mhLtsnSxnkbbw7fPORuh/9w+JXTr9w94+5j/+PYL//rlxErcl/dfXW31n3nP0Y44A8A\n8Kd8ZZmI+bx975mhG2F2M7v2xyW1S5bULpGU3d7+ct9f3jn1zgcaHtjWtE1XE2t/tf+vhl982rhp\n2f/4UuOXBt7+o5t/NJofHN34843//uV//9S0T2V3U0nd73UPP0Gx9v+u3bN5z1233fXVpq9mbzl+\n7vjut3bnvT4AwCeKXpZ5vuv5lJ0afnv2H97SmfSqx1fdPePulniLI6e9p/3V068OeWz2nrmu83rv\n64bnvfbPe+9fen/BjxfcO+vexTMWp+zU/t/tv7Xq1iW1S7J3uHbPMxfPNP+4eemspQvjC/uv9P/6\n7V+/dPIlR/xKDQDAR6z4zfGvXf7aiLMfV/2494tDvyIEAMBL3lL8F6adrphlGQAAKk6+skzY2eAk\njyXrMnUxxQbOEtFE//p+TS3hWgEAKLqQnImmnc7SI7I6rfBTYVNZxpa6pOwBhxqpQYoOeA6mTJky\nZcq0sqeGnS5/WcY6aoV3hWtUM8ueJelk9GSf+q5tk0yZMmXKlGnlTw07nWVtsqrbBp+3v/oFY2pD\nShJTpkyZMmXq46kVrYpuu7Rt+EnDXvVur9ouR9suM2XKlClTpr6dmsoy4zPjq51qpkyZMmXK1K/T\nPGWZcelxtzk5f1EDU6ZMmTJl6vVprV0byjUDACAIQqcjp3PNLkQuMGXKlClTpj6enoqeMpVlzofO\nvxtmypQpU6ZMfTvNX5bJzM0wZcqUKVOmPp5eL8tM0qR6u15Sd7T7rM5eP6LIlClTpkyZ+nf6/wGh\nwAGYbzhHXQAAAABJRU5ErkJggg==\n", "image/svg+xml": [ "10.2 Idle" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "fitness: 108.88888888888889\n" ] } ], "source": [ "watch_one(pop[0][1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`make_movie()` takes a DNA string and a filename, and makes a bunch of gif files:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [], "source": [ "make_movie(pop[0][1], \"ladybug-0\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can turn the ladybug-0-\\*.gif files into a movie named moview-0.gif with this shell command:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [], "source": [ "! convert -delay 20 -loop 0 ladybug-0-*.gif movie-0.gif" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This cell is a markdown cell that shows how to display an animated gif file in your notebook using HTML:\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, you may want to delete the extra gif files with this shell command:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [], "source": [ "! rm ladybug-*.gif" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Team Reflection\n", "\n", "In the next cell, add your reflections, including:\n", "\n", "* What was your approach in picking parameters? Explain?\n", "* What is the relationship between size of the population and diversity of the gene pool?\n", "* What could make this evolution more realistic? What is missing?\n", "* From what you know about ladybug control, what could this DNA be representing? Why 93?\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "nbgrader": { "checksum": "7ee6ff3a6d0d1d360746c03be8d788f4", "grade": true, "grade_id": "reflection", "locked": false, "points": 80, "solution": true } }, "source": [ "YOUR ANSWER HERE" ] } ], "metadata": { "celltoolbar": "Create Assignment", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }